Blktapctrl compatibility layer
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 9 Jul 2008 09:41:49 +0000 (10:41 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 9 Jul 2008 09:41:49 +0000 (10:41 +0100)
I originally had just changed the NEWINTF ioctl to send over 48-bits
of information, which works on 64-bit but not on 32-bit (since the arg
is an unsigned long).  Additionally, the previous changes would break
an older userland against a new kernel.  For that reason, introduce a
new ioctl (NEWINTF_EXT) that fixes both of these problems.  This is
the dom0 userland side.

Signed-off-by: Chris Lalancette <clalance@redhat.com>
tools/blktap/drivers/blktapctrl.c
tools/blktap/lib/blktaplib.h

index 88e30bbca9370cd880d57306a31e65f7a8cf1651..337fc6b71f8e4eeed1e0627996b3be6f2b6a5c03 100644 (file)
@@ -123,12 +123,25 @@ static void make_blktap_dev(char *devname, int major, int minor)
 static int get_new_dev(int *major, int *minor, blkif_t *blkif)
 {
        domid_translate_t tr;
+       domid_translate_ext_t tr_ext;
        int ret;
        char *devname;
        
-       tr.domid = blkif->domid;
-        tr.busid = blkif->be_id;
-       ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr );
+       if (blkif->be_id >= (1<<28)) {
+               /* new-style backend-id, so use the extended structure */
+               tr_ext.domid = blkif->domid;
+               tr_ext.busid = blkif->be_id;
+               ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF_EXT, &tr_ext);
+               DPRINTF("Sent domid %d and be_id %d\n", tr_ext.domid,
+                       tr_ext.busid);
+       }
+       else {
+               /* old-style backend-id; use the old structure */
+               tr.domid = blkif->domid;
+               tr.busid = (unsigned short)blkif->be_id;
+               ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr);
+               DPRINTF("Sent domid %d and be_id %d\n", tr.domid, tr.busid);
+       }
        
        if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) {
                DPRINTF("Incorrect Dev ID [%d]\n",ret);
@@ -145,9 +158,8 @@ static int get_new_dev(int *major, int *minor, blkif_t *blkif)
        if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME, *minor) == -1)
                return -1;
        make_blktap_dev(devname,*major,*minor); 
-       DPRINTF("Received device id %d and major %d, "
-               "sent domid %d and be_id %d\n",
-               *minor, *major, tr.domid, tr.busid);
+       DPRINTF("Received device id %d and major %d\n",
+               *minor, *major);
        return 0;
 }
 
index 1bba3639339d8dd41a57241314ab32415268ef41..58a6fd897a6c97a57cf2db06eb48ae5b51dc92e4 100644 (file)
@@ -57,6 +57,7 @@
 #define BLKTAP_IOCTL_MAJOR          7
 #define BLKTAP_QUERY_ALLOC_REQS      8
 #define BLKTAP_IOCTL_FREEINTF       9
+#define BLKTAP_IOCTL_NEWINTF_EXT     50
 #define BLKTAP_IOCTL_PRINT_IDXS      100   
 
 /* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE)             */
@@ -161,9 +162,14 @@ typedef struct tapdev_info {
 
 typedef struct domid_translate {
        unsigned short domid;
-       uint32_t busid;
+       unsigned short busid;
 } domid_translate_t ;
 
+typedef struct domid_translate_ext {
+       unsigned short domid;
+       uint32_t busid;
+} domid_translate_ext_t ;
+
 typedef struct image {
        unsigned long long size;
        unsigned long secsize;